package ar.uba.fi.tecnicas.fabrica;

import java.awt.Dimension;
import java.awt.Point;
import java.util.Observable;
import java.util.Observer;

import ar.uba.fi.tecnicas.fabrica.exceptions.PosicionTerrenoOcupadaException;

public class Terreno extends Observable implements Observer
{
	public enum ModoAdquisicion
	{
		Alquiler,
		Compra
	}
	
	private Dimension dimensiones;
	private double precioCompra;
	private double precioAlquiler;
	private ModoAdquisicion modoPropiedad;
	
	private PosicionTerreno[][] posiciones;
	
	public Terreno(Dimension dimensiones, double precioCompra, double precioAlquiler)
	{
		this.dimensiones = dimensiones;
		this.precioCompra = precioCompra;
		this.precioAlquiler = precioAlquiler;
		this.posiciones = new PosicionTerreno[this.dimensiones.width][this.dimensiones.height];
	}
	
	public Dimension getDimensiones()
	{
		return this.dimensiones;
	}

	public int getAncho()
	{
		return this.dimensiones.width;
	}
	
	public int getAlto()
	{
		return this.dimensiones.height;
	}

	public double getPrecio(ModoAdquisicion modo)
	{
		double precio = 0;
		switch(modo)
		{
			case Alquiler:
				precio = this.precioCompra;
				break;
			case Compra:
				precio = this.precioAlquiler;
				break;
		}
		return precio;
	}

	public ModoAdquisicion getModoPropiedad()
	{
		return this.modoPropiedad;
	}
	
	public void setPosicion(PosicionTerreno posicion) throws PosicionTerrenoOcupadaException
	{
		if(this.posicionOcupada(posicion.getPosicion()))
		{
			throw new PosicionTerrenoOcupadaException();
		}

		this.posiciones[posicion.getPosicion().x][posicion.getPosicion().y] = posicion;
		
		posicion.addObserver(this);
		
		this.setChanged();
		this.notifyObservers();
	}
	
	public PosicionTerreno getPosicion(int x, int y)
	{
		return this.posiciones[x][y];
	}
	
	public PosicionTerreno getPosicion(Point posicion)
	{
		return this.posiciones[posicion.x][posicion.y];
	}
	
	public void update(Observable observable, Object arg)
	{
		this.setChanged();
		this.notifyObservers();
	}
	
	public boolean posicionOcupada(Point posicion) 
	{		
		return this.posicionOcupada(posicion.x, posicion.y);
	}

	public boolean posicionOcupada(int x, int y) 
	{		
		return this.posiciones[x][y] != null;
	}
}
